javascriptのテストのはなし:QUnit
こんにちは。ともだです。
今回からはjavascriptのテストネタでいこうと思います。まずは単体テストツールのQUnitについてです。
QUnitはその名から想像される通りで、xUnit系のフレームワークです。javascript用のxUnitフレームワークだと他にはJsUnitが有名ですね。
QUnitはjQuery用のテスティングフレームワークで、そこから派生してトップレベルのプロジェクトになったものです。jQueryを使ってるプロジェクトなら導入しやすいと思います。
という事で早速使ってみます。
■まず基本
jQueryのライブラリの他にQUnitのライブラリを読み込みます。
CDNはhttp://code.jquery.com/qunit/git/qunit.jsですが、いちいちリクエストを飛ばすのもなんなのでファイルをローカルに置いておいた方が良いかと思います。
次に、htmlのbodyに下記のdivを用意しておきます。
<h1 id="qunit-header">Test</h1> <h2 id="toc-1" id="qunit-banner"></h2> <h2 id="toc-2" id="qunit-userAgent"></h2> <ol id="qunit-tests"></ol>
テストが終わったらQUnitはこのタグにテスト結果を生成します。あとは、scriptタグの中にテストコードを書いていくだけです。
■アサーション
使えるアサーションは次の様になっています。
メソッド | 説明 |
---|---|
ok( state, message ) | Booleanの判定です。JUnitだとassertTrueに相当します |
equal( actual, expected, message ) | 値比較です。JUnitのassertEqualsに相当します |
notEqual( actual, expected, message ) | JUnitのassertNotEqualsに相当します |
deepEqual( actual, expected, message ) | オブジェクトや配列の中を再帰的にチェックしてくれます |
notDeepEqual( actual, expected, message ) | deepEqualの反対で等価じゃない事をチェックします |
strictEqual( actual, expected, message ) | ===で比較してくれます |
notStrictEqual( actual, expected, message ) | strictEqualの反対!==でチェックします |
raises( block, expected, message ) | Errorが発生したかどうかをチェックします |
■テストを記述する
その前にテスト対象のクラスとしてHogeを作っておきます。
var Hoge = function(){}; Hoge.prototype.add = function(param1, param2){ return param1 + param2; }; Hoge.prototype.package = function(param1, param2){ return {p1:param1, p2:param2} }; Hoge.prototype.throwError = function(){ throw new Error(); };
テストを記述するにはtest("テスト名", function(){/*テスト*/})を使います。
addをテストするならこんな感じです。equalのアサーションを使ってみます。
test("equal", function(){ var hoge = new Hoge(); equal(hoge.add(1,2), 3); });
Objectの比較をしてみます。
test("deepEqual stricEqual", function(){ var hoge = new Hoge(); var obj = hoge.package("test1","test2") deepEqual(obj, {p1:"test1", p2:"test2"}); //Objectの再帰的な比較 var copiedObj = obj; strictEqual(obj, copiedObj); //そのものかどうかの比較 });
最後にエラーがスローされたかチェックします。
test("raises", function(){ var hoge = new Hoge(); raises(hoge.throwError, Error); });
■実行する
実行するにはこれらのテストを記述したhtmlをブラウザで開くだけです。まずは上の記述を少し変えてNGになる様にしてみます。実際に開いてみるとこんな感じで表示されます。NGの理由が親切だったり、そうじゃなかったりですが、使うには問題なさそうです。
元の記述に変えてOKになる様にしてみます。
オールグリーンになりました。
ちなみに各テストの右横にある「Return」というリンクを押すと、そのテストだけフィルターされて表示されます。戻るにはブラウザの戻るボタンを押すしかない様です。
という事で今回はここまでです。最後に今回作ったhtmlを掲載しておきます。
こちらに続きを書きました。
<html lang="en"> <head> <title>QUnit</title> <script src="./resources/jquery-latest.js"></script> <link rel="stylesheet" href="./resources/qunit.css" type="text/css" media="screen" /> <script type="text/javascript" src="./resources/qunit.js"></script> <script type="text/javascript"> $(document).ready(function(){ test("equal", function(){ var hoge = new Hoge(); equal(hoge.add(1,2), 3); }); test("deepEqual stricEqual", function(){ var hoge = new Hoge(); var obj = hoge.package("test1","test2") deepEqual(obj, {p1:"test1", p2:"test2"}); //Objectの再帰的な比較 var copiedObj = obj; strictEqual(obj, copiedObj); //そのものかどうかの比較 }); test("raises", function(){ var hoge = new Hoge(); raises(hoge.throwError, Error); }); }); var Hoge = function(){ }; Hoge.prototype.add = function(param1, param2){ return param1 + param2; }; Hoge.prototype.package = function(param1, param2){ return {p1:param1, p2:param2} }; Hoge.prototype.throwError = function(){ throw new Error(); }; </script> </head> <body> <h1 id="qunit-header">Test</h1> <h2 id="toc-6" id="qunit-banner"></h2> <h2 id="toc-7" id="qunit-userAgent"></h2> <ol id="qunit-tests"></ol> </body> </html>